package org.pjmi.conversormonedaletra.conversor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.pjmi.conversormonedaletra.beans.MonedaEntero;
import org.pjmi.conversormonedaletra.beans.MonedaFraccion;

/**
 * Clase abstracta para el proceso de lectura, traduccion y escritura de una cantidad monetaria.
 * @author Pedro Josue Mendoza Islas.
 */
public abstract class Conversor {
    protected StringBuilder montoLetra;
    protected Map<String, Object> valores;
    
    public String traducirMoneda(Number valor) {
        lectorMoneda(valor);
        return escritorLetra();
    }
    
    public String traducirLetra(Number valor) {        
        return montoLetra.toString();
    }
    
    private void lectorMoneda(Number valor) {
        valores = new HashMap<String, Object>();
        ArrayList<MonedaEntero> monedaEnteros = new ArrayList<MonedaEntero>();
        int enteros = valor.intValue();
        String enterosStr = String.valueOf(enteros);
        int fracciones = leerFracciones(valor);
        MonedaFraccion monedaFraccion = new MonedaFraccion();
        int bloques = 0;
        int aux = 0;
        int base = enterosStr.length();
        int auxDivisorCentenas = 100000000;
        int auxDivisorDecenas = 10000000;
        int auxDivisorUnidades = 1000000;
        
        try {
            for (int i = 0; i < 3; i++) {
                MonedaEntero enteroAux = new MonedaEntero();
                if (enteros >= auxDivisorCentenas && enteros / auxDivisorCentenas > 0) {
                    enteroAux.setCentenas(enteros / auxDivisorCentenas);
                    enteros = enteros % auxDivisorCentenas;

                    if (enteros >= auxDivisorDecenas && enteros / auxDivisorDecenas > 0) {
                        enteroAux.setDecenas(enteros / auxDivisorDecenas);
                        enteros = enteros % auxDivisorDecenas;

                        if (enteros >= auxDivisorUnidades && enteros / auxDivisorUnidades > 0) {
                            enteroAux.setUnidades(enteros / auxDivisorUnidades);
                            enteros = enteros % auxDivisorUnidades;

                        }
                    } else if (enteros >= auxDivisorUnidades && enteros / auxDivisorUnidades > 0) {
                        enteroAux.setUnidades(enteros / auxDivisorUnidades);
                        enteros = enteros % auxDivisorUnidades;
                    }
                } else if (enteros >= auxDivisorDecenas && enteros / auxDivisorDecenas > 0) {
                    enteroAux.setDecenas(enteros / auxDivisorDecenas);
                    enteros = enteros % auxDivisorDecenas;
                    if (enteros >= auxDivisorUnidades && enteros / auxDivisorUnidades > 0) {
                        enteroAux.setUnidades(enteros / auxDivisorUnidades);
                        enteros = enteros % auxDivisorUnidades;
                    }
                } else if (enteros >= auxDivisorUnidades && enteros / auxDivisorUnidades > 0) {
                    enteroAux.setUnidades(enteros / auxDivisorUnidades);
                    enteros = enteros % auxDivisorUnidades;
                }
                auxDivisorCentenas = auxDivisorCentenas / 1000;
                auxDivisorDecenas = auxDivisorDecenas / 1000;
                auxDivisorUnidades = auxDivisorUnidades / 1000;
                monedaEnteros.add(enteroAux);
            }
            if (fracciones > 9) {
                monedaFraccion.setDecenas(fracciones / 10);
                monedaFraccion.setUnidades(fracciones % 10);
            } else {
                monedaFraccion.setDecenas(0);
                monedaFraccion.setUnidades(fracciones);
            }
            valores.put("pesos", monedaEnteros);
            valores.put("centavos", monedaFraccion);    
        } catch (Exception ex) {
            System.err.println("Error, pkaaaa! : " + ex);
        }
    }
    
    private Map<String, Object> lectorLetra(String valor) {
        return null;
    }
    
    public abstract String escritorLetra();
    
    public abstract String escritorMoneda();
    
    
        private int leerFracciones(Number number) {
        int fracciones = 0;
        String numberStr = String.valueOf(number);
        String fraccionStr = null;
        try {
            if (numberStr.contains(".")) {
                fraccionStr = numberStr.substring(numberStr.indexOf(".") + 1, numberStr.length());
                fracciones = Integer.parseInt(fraccionStr);

                if (fraccionStr.length() == 1) {
                    fracciones = fracciones * 10;
                }
            }

        } catch (Exception ex) {
            System.err.println("No tiene formato decimal");
        }
        return fracciones;

    }
}
